/**
 * 统一接口返回格式和日志记录中间件
 * @param {Object} options - 中间件配置
 * @param {Egg.Application} app - Egg应用实例
 */
module.exports = (options, app) => {
  return async function unifiedResponse(ctx, next) {
    const startTime = Date.now();
    const logData = {
      method: ctx.method,
      url: ctx.url,
      ip: ctx.ip,
      query: ctx.query,
      params: ctx.params,
      body: ctx.method === "GET" ? undefined : ctx.request.body,
      timestamp: new Date().toISOString(),
    };
    ctx.msg = "";

    try {
      // 执行后续中间件
      await next();

      // 处理正常响应
      const responseData = {
        code: ctx.status === 200 ? 0 : ctx.status, // 0表示成功，其他为错误码
        success: ctx.status === 200 ? true : false,
        message: ctx.msg || "",
        data: ctx.body !== undefined ? ctx.body : null,
        requestId: ctx.requestId || Date.now().toString(), // 可与日志系统关联的请求ID
      };

      // 设置响应体和类型
      ctx.body = responseData;
      ctx.type = "application/json";

      // 记录成功日志
      logData.status = ctx.status;
      logData.responseTime = Date.now() - startTime;
      logData.success = true;
      app.logger.info("[REQUEST_LOG]", logData);
      app.logger.info("[RESPONSE_LOG]", responseData);
    } catch (error) {
      // 处理异常
      const errorCode = error.status || error.code || 500;
      const errorMessage = error.message || "服务器内部错误";

      // 构建错误响应
      const errorResponse = {
        code: errorCode,
        message: errorMessage,
        data:
          options.showErrorStack && app.config.env === "local"
            ? error.stack
            : null,
        requestId: ctx.requestId || Date.now().toString(),
      };

      // 设置错误响应
      ctx.status = errorCode >= 400 && errorCode < 600 ? errorCode : 500;
      ctx.body = errorResponse;
      ctx.type = "application/json";

      // 记录错误日志
      logData.status = ctx.status;
      logData.responseTime = Date.now() - startTime;
      logData.success = false;
      logData.error = {
        message: errorMessage,
        stack: error.stack,
        code: errorCode,
      };

      // 根据错误级别记录不同类型的日志
      if (errorCode >= 500) {
        app.logger.error("[REQUEST_ERROR]", logData);
      } else {
        app.logger.warn("[REQUEST_WARN]", logData);
      }
    }
  };
};
